package jp.co.nes.awssupport.common.utility;

import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.stepfunctions.AWSStepFunctions;
import com.amazonaws.services.stepfunctions.AWSStepFunctionsClientBuilder;
import com.amazonaws.services.stepfunctions.model.GetActivityTaskRequest;
import com.amazonaws.services.stepfunctions.model.GetActivityTaskResult;
import com.amazonaws.services.stepfunctions.model.SendTaskFailureRequest;
import com.amazonaws.services.stepfunctions.model.SendTaskFailureResult;
import com.amazonaws.services.stepfunctions.model.SendTaskSuccessRequest;
import com.amazonaws.services.stepfunctions.model.SendTaskSuccessResult;

import jp.co.nes.awssupport.common.bean.BaseBean;

/**
 * AWSStepFunctionsヘルパーです。<br>
 * StepFunctionsに関する機能を提供します。
 */
public class AwsStepFunctionsHelper extends AwsHelperBase {

    /** クライアント */
    private AWSStepFunctions client;

    /**
     * デフォルトコンストラクタです。
     */
    public AwsStepFunctionsHelper() {
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.common.utility.AwsHelperBase#init(com.amazonaws.regions.Regions, com.amazonaws.auth.AWSCredentials, com.amazonaws.ClientConfiguration)
     */
    @Override
    protected void init(Regions regions, AWSCredentials credentials, ClientConfiguration config) {
        boolean isLocalTest = Boolean.valueOf(PropertiesUtil.getProperty("LocalTest", "false"));
        if (!isLocalTest) {
            if (credentials == null) {
                if (config == null) {
                    client = AWSStepFunctionsClientBuilder.standard()
                            .withRegion(regions)
                            .build();
                } else {
                    client = AWSStepFunctionsClientBuilder.standard()
                            .withRegion(regions)
                            .withClientConfiguration(config)
                            .build();
                }
            } else {
                if (config == null) {
                    client = AWSStepFunctionsClientBuilder.standard()
                            .withRegion(getRegions())
                            .withCredentials(new AWSStaticCredentialsProvider(credentials))
                            .withClientConfiguration(new ClientConfiguration())
                            .build();
                } else {
                    client = AWSStepFunctionsClientBuilder.standard()
                            .withRegion(getRegions())
                            .withCredentials(new AWSStaticCredentialsProvider(credentials))
                            .withClientConfiguration(config)
                            .build();
                }
            }
        }
    }

    /**
     * アクティビティに関する情報を返却します。
     *
     * @param activityArn アクティビティのarn
     * @return アクティビティに関する情報
     */
    public GetActivityTaskResult getActivityTask(String activityArn) {
        GetActivityTaskRequest request = new GetActivityTaskRequest();
        request.setActivityArn(activityArn);
        return client.getActivityTask(request);
    }

    /**
     * 処理が成功したことを送信します。
     *
     * @param taskToken アクティビティのトークン
     * @param outputBean 送信内容のBeanクラス
     * @return 送信結果
     */
    public <T extends BaseBean> SendTaskSuccessResult sendTaskSuccess(String taskToken, T bean) {
        SendTaskSuccessRequest request = new SendTaskSuccessRequest();
        request.setTaskToken(taskToken);
        request.setOutput(JsonUtil.convertBeanToJsonString(bean));
        return client.sendTaskSuccess(request);
    }

    /**
     * 処理が失敗したことを送信します。
     *
     * @param taskToken アクティビティのトークン
     * @param error エラー内容
     * @param cause 原因
     * @return 送信結果
     */
    public SendTaskFailureResult sendTaskFailure(String taskToken, String error, String cause) {
        SendTaskFailureRequest request = new SendTaskFailureRequest();
        request.setTaskToken(taskToken);
        request.setError(error);
        request.setCause(cause);
        return client.sendTaskFailure(request);
    }
}
